package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.dto.DeliveryDTO;
import com.cencat.order.entity.Delivery;
import com.cencat.order.vo.DeliveryVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 配送跟踪业务逻辑接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface DeliveryService extends IService<Delivery> {

    /**
     * 分页查询配送列表
     *
     * @param page 分页参数
     * @param deliveryCode 配送编号(模糊查询)
     * @param orderId 订单ID
     * @param dispatchId 派单ID
     * @param driverId 司机ID
     * @param vehicleId 车辆ID
     * @param merchantId 商家ID
     * @param deliveryStatus 配送状态
     * @param deliveryType 配送类型
     * @param priority 优先级
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 配送分页列表
     */
    IPage<DeliveryVO> getDeliveryPage(Page<DeliveryVO> page,
                                     String deliveryCode,
                                     Long orderId,
                                     Long dispatchId,
                                     Long driverId,
                                     Long vehicleId,
                                     Long merchantId,
                                     Integer deliveryStatus,
                                     String deliveryType,
                                     Integer priority,
                                     LocalDateTime startTime,
                                     LocalDateTime endTime);

    /**
     * 根据配送编号查询配送信息
     *
     * @param deliveryCode 配送编号
     * @return 配送信息
     */
    DeliveryVO getByDeliveryCode(String deliveryCode);

    /**
     * 根据订单ID查询配送信息
     *
     * @param orderId 订单ID
     * @return 配送信息
     */
    DeliveryVO getByOrderId(Long orderId);

    /**
     * 根据派单ID查询配送信息
     *
     * @param dispatchId 派单ID
     * @return 配送信息
     */
    DeliveryVO getByDispatchId(Long dispatchId);

    /**
     * 根据司机ID查询配送列表
     *
     * @param driverId 司机ID
     * @param deliveryStatus 配送状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送列表
     */
    List<DeliveryVO> getByDriverId(Long driverId,
                                  Integer deliveryStatus,
                                  LocalDateTime startTime,
                                  LocalDateTime endTime);

    /**
     * 根据车辆ID查询配送列表
     *
     * @param vehicleId 车辆ID
     * @param deliveryStatus 配送状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送列表
     */
    List<DeliveryVO> getByVehicleId(Long vehicleId,
                                   Integer deliveryStatus,
                                   LocalDateTime startTime,
                                   LocalDateTime endTime);

    /**
     * 根据商家ID查询配送列表
     *
     * @param merchantId 商家ID
     * @param deliveryStatus 配送状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 配送列表
     */
    List<DeliveryVO> getByMerchantId(Long merchantId,
                                    Integer deliveryStatus,
                                    LocalDateTime startTime,
                                    LocalDateTime endTime);

    /**
     * 查询配送统计信息
     *
     * @param driverId 司机ID
     * @param vehicleId 车辆ID
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> getDeliveryStatistics(Long driverId,
                                             Long vehicleId,
                                             Long merchantId,
                                             LocalDateTime startTime,
                                             LocalDateTime endTime);

    /**
     * 创建配送信息
     *
     * @param deliveryDTO 配送数据传输对象
     * @return 创建结果
     */
    boolean createDelivery(DeliveryDTO deliveryDTO);

    /**
     * 更新配送信息
     *
     * @param deliveryId 配送ID
     * @param deliveryDTO 配送数据传输对象
     * @return 更新结果
     */
    boolean updateDelivery(Long deliveryId, DeliveryDTO deliveryDTO);

    /**
     * 开始配送
     *
     * @param deliveryId 配送ID
     * @param startTime 开始时间
     * @param startLocation 开始位置
     * @param startRemark 开始备注
     * @return 开始结果
     */
    boolean startDelivery(Long deliveryId,
                         LocalDateTime startTime,
                         String startLocation,
                         String startRemark);

    /**
     * 到达取货点
     *
     * @param deliveryId 配送ID
     * @param arrivalTime 到达时间
     * @param arrivalLocation 到达位置
     * @param arrivalRemark 到达备注
     * @return 到达结果
     */
    boolean arriveAtPickup(Long deliveryId,
                          LocalDateTime arrivalTime,
                          String arrivalLocation,
                          String arrivalRemark);

    /**
     * 完成取货
     *
     * @param deliveryId 配送ID
     * @param pickupTime 取货时间
     * @param pickupLocation 取货位置
     * @param pickupPersonName 取货人姓名
     * @param pickupPersonPhone 取货人电话
     * @param pickupRemark 取货备注
     * @param pickupImages 取货图片
     * @return 取货结果
     */
    boolean completePickup(Long deliveryId,
                          LocalDateTime pickupTime,
                          String pickupLocation,
                          String pickupPersonName,
                          String pickupPersonPhone,
                          String pickupRemark,
                          String pickupImages);

    /**
     * 运输中
     *
     * @param deliveryId 配送ID
     * @param transitTime 运输开始时间
     * @param currentLocation 当前位置
     * @param estimatedArrivalTime 预计到达时间
     * @param transitRemark 运输备注
     * @return 运输结果
     */
    boolean inTransit(Long deliveryId,
                     LocalDateTime transitTime,
                     String currentLocation,
                     LocalDateTime estimatedArrivalTime,
                     String transitRemark);

    /**
     * 到达配送点
     *
     * @param deliveryId 配送ID
     * @param arrivalTime 到达时间
     * @param arrivalLocation 到达位置
     * @param arrivalRemark 到达备注
     * @return 到达结果
     */
    boolean arriveAtDelivery(Long deliveryId,
                            LocalDateTime arrivalTime,
                            String arrivalLocation,
                            String arrivalRemark);

    /**
     * 完成配送
     *
     * @param deliveryId 配送ID
     * @param deliveryTime 配送时间
     * @param deliveryLocation 配送位置
     * @param recipientName 收货人姓名
     * @param recipientPhone 收货人电话
     * @param signatureImage 签名图片
     * @param deliveryImages 配送图片
     * @param deliveryRemark 配送备注
     * @return 配送结果
     */
    boolean completeDelivery(Long deliveryId,
                            LocalDateTime deliveryTime,
                            String deliveryLocation,
                            String recipientName,
                            String recipientPhone,
                            String signatureImage,
                            String deliveryImages,
                            String deliveryRemark);

    /**
     * 配送异常处理
     *
     * @param deliveryId 配送ID
     * @param exceptionType 异常类型
     * @param exceptionDescription 异常描述
     * @param exceptionTime 异常时间
     * @param exceptionLocation 异常位置
     * @param handlingAction 处理动作
     * @param handlingResult 处理结果
     * @return 处理结果
     */
    boolean handleDeliveryException(Long deliveryId,
                                   String exceptionType,
                                   String exceptionDescription,
                                   LocalDateTime exceptionTime,
                                   String exceptionLocation,
                                   String handlingAction,
                                   String handlingResult);

    /**
     * 更新配送状态
     *
     * @param deliveryId 配送ID
     * @param deliveryStatus 配送状态
     * @param statusRemark 状态备注
     * @return 更新结果
     */
    boolean updateDeliveryStatus(Long deliveryId,
                                Integer deliveryStatus,
                                String statusRemark);

    /**
     * 更新配送位置
     *
     * @param deliveryId 配送ID
     * @param currentLatitude 当前纬度
     * @param currentLongitude 当前经度
     * @param currentAddress 当前地址
     * @param locationUpdateTime 位置更新时间
     * @param locationAccuracy 位置精度
     * @return 更新结果
     */
    boolean updateDeliveryLocation(Long deliveryId,
                                  BigDecimal currentLatitude,
                                  BigDecimal currentLongitude,
                                  String currentAddress,
                                  LocalDateTime locationUpdateTime,
                                  BigDecimal locationAccuracy);

    /**
     * 更新配送时间信息
     *
     * @param deliveryId 配送ID
     * @param estimatedPickupTime 预计取货时间
     * @param estimatedDeliveryTime 预计配送时间
     * @param actualPickupTime 实际取货时间
     * @param actualDeliveryTime 实际配送时间
     * @return 更新结果
     */
    boolean updateDeliveryTimeInfo(Long deliveryId,
                                  LocalDateTime estimatedPickupTime,
                                  LocalDateTime estimatedDeliveryTime,
                                  LocalDateTime actualPickupTime,
                                  LocalDateTime actualDeliveryTime);

    /**
     * 更新签收信息
     *
     * @param deliveryId 配送ID
     * @param recipientName 收货人姓名
     * @param recipientPhone 收货人电话
     * @param recipientIdCard 收货人身份证
     * @param signTime 签收时间
     * @param signLocation 签收位置
     * @param signatureImage 签名图片
     * @param signRemark 签收备注
     * @return 更新结果
     */
    boolean updateSignInfo(Long deliveryId,
                          String recipientName,
                          String recipientPhone,
                          String recipientIdCard,
                          LocalDateTime signTime,
                          String signLocation,
                          String signatureImage,
                          String signRemark);

    /**
     * 更新配送费用信息
     *
     * @param deliveryId 配送ID
     * @param baseFee 基础费用
     * @param distanceFee 距离费用
     * @param timeFee 时间费用
     * @param weightFee 重量费用
     * @param urgentFee 加急费用
     * @param insuranceFee 保险费用
     * @param otherFee 其他费用
     * @param totalFee 总费用
     * @return 更新结果
     */
    boolean updateDeliveryFeeInfo(Long deliveryId,
                                 BigDecimal baseFee,
                                 BigDecimal distanceFee,
                                 BigDecimal timeFee,
                                 BigDecimal weightFee,
                                 BigDecimal urgentFee,
                                 BigDecimal insuranceFee,
                                 BigDecimal otherFee,
                                 BigDecimal totalFee);

    /**
     * 更新配送评价信息
     *
     * @param deliveryId 配送ID
     * @param customerRating 客户评分
     * @param customerFeedback 客户反馈
     * @param serviceRating 服务评分
     * @param timelinessRating 时效评分
     * @param qualityRating 质量评分
     * @param overallRating 综合评分
     * @return 更新结果
     */
    boolean updateDeliveryRatingInfo(Long deliveryId,
                                    BigDecimal customerRating,
                                    String customerFeedback,
                                    BigDecimal serviceRating,
                                    BigDecimal timelinessRating,
                                    BigDecimal qualityRating,
                                    BigDecimal overallRating);

    /**
     * 批量更新配送状态
     *
     * @param deliveryIds 配送ID列表
     * @param deliveryStatus 配送状态
     * @return 更新结果
     */
    boolean batchUpdateDeliveryStatus(List<Long> deliveryIds, Integer deliveryStatus);

    /**
     * 配送路径优化
     *
     * @param deliveryId 配送ID
     * @param optimizationGoals 优化目标
     * @param trafficConditions 交通状况
     * @param weatherConditions 天气状况
     * @return 优化路径
     */
    Map<String, Object> optimizeDeliveryRoute(Long deliveryId,
                                             List<String> optimizationGoals,
                                             Map<String, Object> trafficConditions,
                                             Map<String, Object> weatherConditions);

    /**
     * 配送时效预测
     *
     * @param deliveryId 配送ID
     * @param predictionFactors 预测因素
     * @return 时效预测结果
     */
    Map<String, Object> predictDeliveryTime(Long deliveryId,
                                           Map<String, Object> predictionFactors);

    /**
     * 配送风险评估
     *
     * @param deliveryId 配送ID
     * @param riskFactors 风险因素
     * @return 风险评估结果
     */
    Map<String, Object> assessDeliveryRisk(Long deliveryId,
                                          List<String> riskFactors);

    /**
     * 配送质量监控
     *
     * @param deliveryId 配送ID
     * @param qualityMetrics 质量指标
     * @return 质量监控结果
     */
    Map<String, Object> monitorDeliveryQuality(Long deliveryId,
                                              List<String> qualityMetrics);

    /**
     * 配送成本分析
     *
     * @param deliveryId 配送ID
     * @param costFactors 成本因素
     * @return 成本分析结果
     */
    Map<String, Object> analyzeDeliveryCost(Long deliveryId,
                                           List<String> costFactors);

    /**
     * 配送效率分析
     *
     * @param startTime 分析开始时间
     * @param endTime 分析结束时间
     * @param analysisScope 分析范围
     * @return 效率分析结果
     */
    Map<String, Object> analyzeDeliveryEfficiency(LocalDateTime startTime,
                                                  LocalDateTime endTime,
                                                  Map<String, Object> analysisScope);

    /**
     * 配送满意度统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param groupBy 分组方式
     * @return 满意度统计结果
     */
    Map<String, Object> getDeliverySatisfactionStatistics(LocalDateTime startTime,
                                                          LocalDateTime endTime,
                                                          String groupBy);

    /**
     * 配送热力图数据
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param regionLevel 区域级别
     * @param metricType 指标类型
     * @return 热力图数据
     */
    List<Map<String, Object>> getDeliveryHeatmapData(LocalDateTime startTime,
                                                     LocalDateTime endTime,
                                                     String regionLevel,
                                                     String metricType);

    /**
     * 配送实时监控
     *
     * @param monitoringScope 监控范围
     * @param alertThresholds 告警阈值
     * @return 实时监控数据
     */
    Map<String, Object> getDeliveryRealTimeMonitoring(Map<String, Object> monitoringScope,
                                                      Map<String, Object> alertThresholds);

    /**
     * 配送异常检测
     *
     * @param detectionPeriod 检测周期
     * @param anomalyTypes 异常类型
     * @return 异常检测结果
     */
    List<Map<String, Object>> detectDeliveryAnomalies(Map<String, LocalDateTime> detectionPeriod,
                                                      List<String> anomalyTypes);

    /**
     * 配送轨迹回放
     *
     * @param deliveryId 配送ID
     * @param playbackSpeed 回放速度
     * @param timeRange 时间范围
     * @return 轨迹回放数据
     */
    List<Map<String, Object>> getDeliveryTrajectoryPlayback(Long deliveryId,
                                                           BigDecimal playbackSpeed,
                                                           Map<String, LocalDateTime> timeRange);

    /**
     * 配送电子围栏监控
     *
     * @param deliveryId 配送ID
     * @param geofenceConfig 电子围栏配置
     * @return 围栏监控结果
     */
    Map<String, Object> monitorDeliveryGeofence(Long deliveryId,
                                               Map<String, Object> geofenceConfig);

    /**
     * 配送智能推荐
     *
     * @param deliveryId 配送ID
     * @param recommendationType 推荐类型
     * @param recommendationCount 推荐数量
     * @return 智能推荐结果
     */
    List<Map<String, Object>> getIntelligentDeliveryRecommendations(Long deliveryId,
                                                                   String recommendationType,
                                                                   Integer recommendationCount);

    /**
     * 配送碳排放计算
     *
     * @param deliveryId 配送ID
     * @param calculationMethod 计算方法
     * @return 碳排放计算结果
     */
    Map<String, Object> calculateDeliveryCarbonEmission(Long deliveryId,
                                                       String calculationMethod);

    /**
     * 配送绿色评估
     *
     * @param deliveryId 配送ID
     * @param assessmentCriteria 评估标准
     * @return 绿色评估结果
     */
    Map<String, Object> assessDeliveryGreenness(Long deliveryId,
                                               List<String> assessmentCriteria);

    /**
     * 软删除配送信息
     *
     * @param deliveryId 配送ID
     * @return 删除结果
     */
    boolean softDeleteDelivery(Long deliveryId);

    /**
     * 批量软删除配送信息
     *
     * @param deliveryIds 配送ID列表
     * @return 删除结果
     */
    boolean batchSoftDeleteDeliveries(List<Long> deliveryIds);

    /**
     * 恢复已删除的配送信息
     *
     * @param deliveryId 配送ID
     * @return 恢复结果
     */
    boolean restoreDelivery(Long deliveryId);

    /**
     * 查询配送操作日志
     *
     * @param deliveryId 配送ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> getDeliveryOperationLogs(Long deliveryId,
                                                       LocalDateTime startTime,
                                                       LocalDateTime endTime,
                                                       Integer limit);
}